package service

import (
	"github.com/TarsCloud/TarsGo/tars"
	"github.com/wzh200x/hyperNexus/hyperNexusProtocol/commonProtocol"
	"github.com/wzh200x/webServer/constants"
	Server "github.com/wzh200x/webServer/server"
)

// 创建角色请求结构
type CreateCharacterRequest struct {
	Name     string `json:"name" form:"name" binding:"required"`         // 角色名称
	Data     string `json:"data" form:"data" binding:"required"`         // 角色数据
	ServerID int32  `json:"serverId" form:"serverId" binding:"required"` // 服务器ID
}

// 修改角色数据请求结构
type UpdateCharacterRequest struct {
	Data string `json:"data" form:"data" binding:"required"` // 角色数据
}

// 角色响应结构
type CharacterResponse struct {
	ID                 uint   `json:"id"`                 // 账号ID
	AvatarID           int    `json:"avatarId"`           // 角色ID
	HyperNexusAvatarId int64  `json:"hyperNexusAvatarId"` // 角色HyperNexusAvatarId
	Name               string `json:"name"`               // 角色名称
	Data               string `json:"data"`               // 角色数据
	UseServer          int32  `json:"useServer"`          // 使用的服务器
}

// CreateCharacter 创建角色
func CreateCharacter(userID uint, username string, req CreateCharacterRequest) (*CharacterResponse, int, string) {
	// 获取DbAgentServerClient
	dbAgentClient := Server.ServerApp.DbAgentServerClient.GetClientProxy()

	// 构建查询参数
	accountQuery := commonProtocol.AccountQuery{
		AccountName: username,
	}

	// 查询账号是否存在
	account, queryErr := dbAgentClient.QueryAccount(accountQuery)
	if queryErr != nil {
		return nil, constants.ErrUnknown, "查询账号失败: " + queryErr.Error()
	}

	// 检查是否已经有角色
	if account.AvatarId > 0 || account.HyperNexusAvatarId > 0 {
		return nil, constants.ErrCharacterExists, "角色已存在"
	}

	// 创建角色
	avatarCreate := commonProtocol.AvatarCreate{
		AccountName: username,
		Data:        req.Data,
	}

	// 调用DbAgentServer创建角色
	avatar, createErr := dbAgentClient.CreatAvatar(avatarCreate)
	if createErr != nil {
		return nil, constants.ErrCharacterCreate, "创建角色失败: " + createErr.Error()
	}

	// 更新账号信息，关联角色ID
	account.AvatarId = avatar.ID
	account.HyperNexusAvatarId = avatar.HyperNexusAvatarId

	// 调用DbAgentServer更新账号
	_, updateErr := dbAgentClient.UpdateAccount(account)
	if updateErr != nil {
		return nil, constants.ErrCharacterCreate, "关联角色失败: " + updateErr.Error()
	}

	// 更新区服信息，将当前服务器ID添加到center的Data中
	// 首先查询center信息
	centerQuery := commonProtocol.CenterQuery{
		Account: username,
	}

	// 查询区服信息
	center, centerQueryErr := dbAgentClient.QueryCenter(centerQuery)
	if centerQueryErr != nil {
		// 如果是记录不存在，则创建一个新的区服信息
		if centerQueryErr.Error() == "record not found" {
			// 创建新的区服信息，使用请求中的服务器ID
			newCenter := commonProtocol.Center{
				Account: username,
				Data:    []int32{req.ServerID}, // 使用请求中的服务器ID
			}

			// 调用DbAgentServer创建区服信息
			_, createCenterErr := dbAgentClient.CreateCenter(newCenter)
			if createCenterErr != nil {
				// 记录错误但不影响角色创建的结果
				tars.GetLogger("").Errorf("创建区服信息失败: %v", createCenterErr)
			}
		} else {
			// 查询失败但不是记录不存在的情况
			tars.GetLogger("").Errorf("查询区服信息失败: %v", centerQueryErr)
		}
	} else {
		// 检查当前服务器ID是否已经在Data中
		serverExists := false
		for _, serverID := range center.Data {
			if serverID == req.ServerID {
				serverExists = true
				break
			}
		}

		// 如果当前服务器ID不在Data中，则添加
		if !serverExists {
			center.Data = append(center.Data, req.ServerID)

			// 调用DbAgentServer更新区服信息
			_, updateCenterErr := dbAgentClient.UpdateCenter(center)
			if updateCenterErr != nil {
				// 记录错误但不影响角色创建的结果
				tars.GetLogger("").Errorf("更新区服信息失败: %v", updateCenterErr)
			}
		}
	}

	// 返回角色信息
	return &CharacterResponse{
		ID:                 userID,
		AvatarID:           int(avatar.ID),
		HyperNexusAvatarId: avatar.HyperNexusAvatarId,
		Name:               avatar.Name,
		Data:               avatar.Data,
		UseServer:          avatar.UseServer,
	}, 0, ""
}

// GetCharacter 获取角色
func GetCharacter(userID uint, username string) (*CharacterResponse, int, string) {
	// 获取DbAgentServerClient
	dbAgentClient := Server.ServerApp.DbAgentServerClient.GetClientProxy()

	// 构建查询参数
	accountQuery := commonProtocol.AccountQuery{
		AccountName: username,
	}

	// 查询账号是否存在
	account, queryErr := dbAgentClient.QueryAccount(accountQuery)
	if queryErr != nil {
		return nil, constants.ErrUnknown, "查询账号失败: " + queryErr.Error()
	}

	// 检查是否有角色
	if account.AvatarId <= 0 && account.HyperNexusAvatarId <= 0 {
		return nil, constants.ErrCharacterNotExist, "角色不存在"
	}

	// 构建查询参数
	avatarQuery := commonProtocol.AvatarQuery{
		AccountName:        username,
		AvatarId:           account.AvatarId,
		HyperNexusAvatarId: account.HyperNexusAvatarId,
	}

	// 查询角色信息
	avatar, avatarErr := dbAgentClient.QueryAvatar(avatarQuery)
	if avatarErr != nil {
		return nil, constants.ErrCharacterNotExist, "查询角色失败: " + avatarErr.Error()
	}

	// 返回角色信息
	return &CharacterResponse{
		ID:                 userID,
		AvatarID:           int(avatar.ID),
		HyperNexusAvatarId: avatar.HyperNexusAvatarId,
		Name:               avatar.Name,
		Data:               avatar.Data,
		UseServer:          avatar.UseServer,
	}, 0, ""
}

// UpdateCharacter 更新角色数据
func UpdateCharacter(userID uint, username string, req UpdateCharacterRequest) (*CharacterResponse, int, string) {
	// 获取DbAgentServerClient
	dbAgentClient := Server.ServerApp.DbAgentServerClient.GetClientProxy()

	// 构建查询参数
	accountQuery := commonProtocol.AccountQuery{
		AccountName: username,
	}

	// 查询账号是否存在
	account, queryErr := dbAgentClient.QueryAccount(accountQuery)
	if queryErr != nil {
		return nil, constants.ErrUnknown, "查询账号失败: " + queryErr.Error()
	}

	// 检查是否有角色
	if account.AvatarId <= 0 && account.HyperNexusAvatarId <= 0 {
		return nil, constants.ErrCharacterNotExist, "角色不存在"
	}

	// 构建查询参数
	avatarQuery := commonProtocol.AvatarQuery{
		AccountName:        username,
		AvatarId:           account.AvatarId,
		HyperNexusAvatarId: account.HyperNexusAvatarId,
	}

	// 查询角色信息
	avatar, avatarErr := dbAgentClient.QueryAvatar(avatarQuery)
	if avatarErr != nil {
		return nil, constants.ErrCharacterNotExist, "查询角色失败: " + avatarErr.Error()
	}

	// 更新角色数据
	avatar.Data = req.Data
	updateAvatarReq := commonProtocol.AvatarUpdate{
		AccountName: username,
		Avatar:      &avatar,
	}
	// 调用DbAgentServer更新角色
	updatedAvatar, updateErr := dbAgentClient.UpdateAvatar(updateAvatarReq)
	if updateErr != nil {
		return nil, constants.ErrCharacterUpdate, "更新角色失败: " + updateErr.Error()
	}

	// 返回更新后的角色信息
	return &CharacterResponse{
		ID:                 userID,
		AvatarID:           int(updatedAvatar.ID),
		HyperNexusAvatarId: updatedAvatar.HyperNexusAvatarId,
		Name:               updatedAvatar.Name,
		Data:               updatedAvatar.Data,
		UseServer:          updatedAvatar.UseServer,
	}, 0, ""
}
